package cn.wolfcode.luowowo.member.service;

import cn.wolfcode.luowowo.common.exception.LogicException;
import cn.wolfcode.luowowo.member.domain.UserInfo;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * throws LogicException:抛出自定义的异常，方便做统一异常处理
 */
public interface IUserInfoService {
    /**
     * 验证手机号是否注册
     * @param phone
     * @return  true：手机号已注册 false：手机号未注册
     */
    boolean checkPhone(String phone) throws LogicException;

    /**
     * 发送验证码
     * @param phone 手机号
     */
    void sendVerifyCode(String phone) throws LogicException;

    /**
     * 注册
     * @param phone 手机号
     * @param nickname  昵称
     * @param password  密码
     * @param rpassword 确认密码
     * @param verifyCode    验证码
     */
    void regist(String phone, String nickname, String password, String rpassword, String verifyCode) throws LogicException;

    /**
     * 用户登陆
     * @param username  用户名
     * @param password  密码
     * @return  该登陆用户的token
     */
    String userLogin(String username, String password) throws LogicException;

    /**
     * 查询所有用户
     * @return
     */
    List<UserInfo> list();

    /**
     * 保存用户
     * @param user
     */
    void saveOrUpdate(UserInfo user);

    /**
     * 获取当前登录用户
     * @param id
     * @return
     */
    UserInfo get(Long id);

    /**
     * 更换用户头像
     * @param user
     */
    void updateUserHeadImg(UserInfo user);

    /**
     * 通过phone修改密码
     * @param phone 手机号
     * @param newpassword 新密码
     * @param verifyCode 验证码
     */
    void updatePasswordByPhone(String phone, String newpassword, String verifyCode) throws LogicException;

    /**
     * 验证邮箱
     * @param id userId
     * @param email
     * @param verifyCode 验证码
     */
    void updateEmailById(Long id, String email, String verifyCode)throws LogicException;

    /**
     * 验证邮箱是否注册
     * @param email
     * @return
     * @throws LogicException
     */
    boolean checkEmail(String email) throws LogicException;

    /**
     * 生成邮箱验证码
     * @param email
     * @throws LogicException
     */
    void sendEmailVerifyCode(String email) throws LogicException;

    /**
     * 验证绑定的手机号
     * @param id userId
     * @param phone 传过来的手机号
     * @param code 手机验证码
     * @return true : 是绑定  false : 不是绑定
     */
    boolean checkPhoneByVerifyCode(Long id, String phone, String code)throws LogicException;

    /**
     * 更换手机号
     * @param id userId
     * @param phone 新手机号
     * @param code 验证码
     */
    void updatePhoneByVerifyCode(Long id, String phone, String code);

    /**
     * 用户注销
     * @param user 当前登录用户
     * @param phone 手机号
     * @param verifyCode 验证码
     */
    void delete(UserInfo user, String phone, String verifyCode) throws LogicException;
}
